//
//  LS_UserAccountViewModel.swift
//  weibo
//
//  Created by 罗李苏 on 16/5/23.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

private let userInfoKey = "com.itheima.userInfoKey"
class LS_UserAccountViewModel: NSObject {
    
    //单例对象
    static let sharedAccountViewModel: LS_UserAccountViewModel = LS_UserAccountViewModel()
    
    //拥有模型属性
    var userAccount: LS_UserAccount?
    
    //重写构造方法 在构造方法中 加载用户的账户模型
    // private 私有化构造方法
   private override init() {
    
        super.init()
    
        userAccount = loadUserAccount()
    }
    
    //通过一判断用户是否登录的计算型属性 来解决 每次都需要判断的问题
    //计算型属性 每次调用都会执行
    var userLogin: Bool{
        if userAccount?.expires_date?.compare(NSDate()) == .OrderedDescending {
            return true
        }
        //如果过期  需要将 userAccount 设置为 nil
        userAccount = nil
        return false

        }
    
    //增加一个用户头像地址 纯种NSURL地址
    //只读属性 特点:每次执行都会进行计算
    var headURL: NSURL?{
        
        get{
        return NSURL(string: userAccount?.avatar_large ?? "")
        }
    }
    

}
//MARK:使用code 加载用户授权的token(令牌)
extension LS_UserAccountViewModel{
    
    func loadAccessToken(code: String, finished:(isSuccess: Bool) -> () ){
    LS_NetworkTools.sharedTools.loadAccessToken(code) { (responseObject, error) in
        //请求token成功之后 使用token 和 uid 获取用户信息
        if error != nil{
        finished(isSuccess: false)
            return
        }
        //请求成功
        
    self.loadUserInfo(responseObject, finishied: finished)
    }
    }
    
    //请求用户信息
private func loadUserInfo(response : AnyObject?, finishied:(isSuccess: Bool) -> ()){
    //尝试将AnyObject? 类型的response 转换为 字典类型 如果转换不成功 就返回失败
    guard let result = response as? [String : AnyObject] else{
        return
    }
    LS_NetworkTools.sharedTools.loadUserInfo(result) { (responseObject, error) in
        if error != nil {
           finishied(isSuccess: false)
            return
        }
        
        //请求成功
        guard var dict = responseObject as? [String :AnyObject] else{
            finishied(isSuccess: false)
        return
        }
        
        //合并两个字典 统一保存用户数据到本地
        for (key,value) in result{
            
            dict[key] = value
        }
        //保存用户信息到本地
        self.saveUserAccount(dict)
         //完成成功的回调
        finishied(isSuccess: true)

    }
    }
}
    
    
 
//MARK:存取数据
extension LS_UserAccountViewModel{
    
    //存储数据
    func saveUserAccount(dict: [String : AnyObject]){
        
        //1. 将dict 转换为 模型对象
        let user = LS_UserAccount(dict: dict)
        self.userAccount = user
        //2. 将模型对象转换字典
        let keys = ["access_token","expires_in","uid","name","avatar_large","expires_date"]
        //转换为字典
        let userInfo = user.dictionaryWithValuesForKeys(keys)
        //3. 把字典保存到偏好设置
        let userDefaults = NSUserDefaults.standardUserDefaults()
        userDefaults.setObject(userInfo, forKey: userInfoKey)
        //4.同步
        userDefaults.synchronize()
        
        
    }
    
    //获取数据  减少这个方法调用 希望只执行一次
    func loadUserAccount() -> LS_UserAccount? {
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String : AnyObject] else {
            //防止没有存储数据的时候 程序崩溃的问题
            return nil
        }
        
        //字典转模型
        //再次判断用户的token是否过期
        let user = LS_UserAccount(dict: dict)
        return user
        
    }
}















